package io.servicios;

import io.Archivo;
import io.Carpeta;
import io.ItemAgenda;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;

/**
 *
 * @author Mariano Zapata
 */
public class ServiciosCliente extends UnicastRemoteObject implements InterfazServiciosCliente {

    private Actualizador actualizador;
    
    private static final String DIRECTORIO= System.getProperty("user.dir") + "/temp/";
    
    @SuppressWarnings("CallToThreadStartDuringObjectConstruction")
    public ServiciosCliente() throws RemoteException
    {
        super();
        actualizador= new Actualizador();
        actualizador.start();
    }
    
    public void detener() {
        actualizador.detener();
    }
    
    @Override
    public boolean estaVivo() throws RemoteException {
        return true;
    }

    @Override
    public void actualizarCarpeta(Carpeta c, int operacion) throws RemoteException {
        Actualizacion a= new Actualizacion(Actualizador.ACTUALIZAR_CARPETA, null, c, null, null, null, operacion);
        actualizador.encolarActualizacion(a);
    }

    @Override
    public void quitarDeCarpeta(Carpeta c, Object o) throws RemoteException {
        Actualizacion a= new Actualizacion(Actualizador.QUITAR_DE_CARPETA, o, c, null, null, null, -1);
        actualizador.encolarActualizacion(a);
    }

    @Override
    public void cortarObjeto(Object o, Carpeta vieja, Carpeta nueva) throws RemoteException {
        Actualizacion a= new Actualizacion(Actualizador.CORTAR_OBJETO, o, vieja, nueva, null, null, -1);
        actualizador.encolarActualizacion(a);
    }

    @Override
    public void actualizarListaAgenda(List<ItemAgenda> items) throws RemoteException {
        Actualizacion a= new Actualizacion(Actualizador.ACTUALIZAR_LISTA_AGENDA, null, null, null, items, null, -1);
        actualizador.encolarActualizacion(a);
    }

    @Override
    public void quitarDeListaAgenda(ItemAgenda item) throws RemoteException {
        Actualizacion a= new Actualizacion(Actualizador.QUITAR_DE_LISTA_AGENDA, null, null, null, null, item, -1);
        actualizador.encolarActualizacion(a);
    }
    
    @Override
    public void escribirArchivo(Archivo archivo, byte[] bytes, int len) throws RemoteException {
        try {
            File fisico= new File(DIRECTORIO + archivo.getNombreFisico());
            if (!fisico.exists())
                fisico.createNewFile();
            FileOutputStream escritor= new FileOutputStream(fisico, true);
            escritor.write(bytes, 0, len);
            escritor.close();
        } catch (FileNotFoundException ex) {throw new RemoteException(ex.getMessage());}
          catch (IOException ex) {throw new RemoteException(ex.getMessage());}
    }
    
    @Override
    public void setProximosEventos(List<ItemAgenda> eventos) throws RemoteException {
        Actualizacion a= new Actualizacion(Actualizador.SET_PROXIMOS_EVENTOS, null, null, null, eventos, null, -1);
        actualizador.encolarActualizacion(a);
    }

    @Override
    public void tiempoCumplido() throws RemoteException {
        Actualizacion a= new Actualizacion(Actualizador.TIEMPO_CUMPLIDO, null, null, null, null, null, -1);
        actualizador.encolarActualizacion(a);
    }
    
    public void agregarActualizadorListener(ActualizadorListener al) {
        actualizador.agregarActualizadorListener(al);
    }
    
    public void quitarActualizadorListener() {
        actualizador.quitarActualizadorListener();
    }
    
    public String getDirectorioTemp() {
        return DIRECTORIO;
    }
}
